package com.zwh.rocketmq.demo.delay;

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.apache.rocketmq.spring.support.RocketMQHeaders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Service;

/**
 * 定时/延时消息
 * @author zwh
 * @date 2024-1-18 17:20
 */
@Slf4j
@Service
public class DelayMessageProduct {
    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    /**
     * 发送延时消息
     */
    public void sendDelayMsg() {
        String destination = "TEST_DELAY_TOPIC";
        String tags = "tag1";
        String msgBody = "hello rocketMQ 延时消息";
        String keys = "orderId1";
        if (StringUtils.isNotBlank(tags)) {
            // 带tag的消息，直接在topic后面加上":tag"， 底层会进行自动转换
            destination = destination + ":" + tags;
        }
        /*
         headers中的key：
            id: 表示消息的id,和mq控制台上的messageId不一样，没什么作用
            TAGS：消息标签
            KEYS： 表示消息的key，用于哈希索引，查找使用
         */
        Message<String> message = MessageBuilder.withPayload(msgBody)
                .setHeader(RocketMQHeaders.KEYS, keys)
                .build();

        //第一个为新建的主题名称，第二个是信息，第三个是超时时间，第四个延迟发送时间
        /*
        delayLevel:延迟等级，共有18个延迟等级，
        默认延迟等级参数messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
         */
        // syncSend(String destination, Message<?> message, long timeout, int delayLevel)
        SendResult sendResult = rocketMQTemplate.syncSend(destination,
                message, 3000L, 3);
        log.info(JSONObject.toJSONString(sendResult));
    }
}
